// ============================== 导出混合 ============================== //

export default (path) => {
  const PRE = path ? `${path.replace('/', '_')}_` : ''

  return {
    /**
     * 模型绑定 (使用 v-model="xxx")
     */
    model: {
      prop: 'addVisible', // 与 props 里的名称一致
      event: 'addClose', // 回传调用的事件名称
    },

    /**
     * 属性注册 (抽取以便查阅)
     */
    props: {
      obj: { type: Object, default: () => null },
      addVisible: { type: Boolean, required: true },
    },

    /**
     * 计算属性 (慎用箭头函数)
     */
    computed: {
      /**
       * 打开方法
       */
      method() {
        const { obj } = this
        return obj && obj.id ? 'Edit' : 'Add'
      },
    },

    /**
     * 监听属性 (深度 deep 首次 immediate)
     */
    watch: {
      /**
       * 监听打开新增
       */
      addVisible(addVisible) {
        addVisible && this[`${PRE}open${this.method}`](this.obj) // 打开新增或修改
      },

      /**
       * 监听关闭新增
       */
      [`${PRE}visible`](visible) {
        !visible && this.toClose()
      },

      /**
       * 监听新增就绪
       */
      [`${PRE}readyAdd`](ready) {
        ready && this.$emit('change') // 触发更新事件
      },

      /**
       * 监听修改就绪
       */
      [`${PRE}readyEdit`](ready) {
        ready && this.$emit('change') // 触发更新事件
      },
    },

    /**
     * 创建完成 (先抽取再调用)
     */
    created() {
      if (this.addVisible) this[`${PRE}open${this.method}`](this.obj) // 打开新增
    },

    /**
     * 本地方法 (轻量重要在前)
     */
    methods: {
      /**
       * 关闭方法
       */
      toClose() {
        this.$emit('addClose', false) // 关闭新增
        this[`${PRE}closeModal`]() // 关闭新增

        setTimeout(() => {
          this.$emit('close', false) // 触发关闭事件
          this[`${PRE}setOne`]() // 重置单项
          this.afterClose() // 关闭之后
        }, 300)
      },

      /**
       * 关闭之后 (可覆盖)
       */
      afterClose() {
        //
      },
    },
  }
}
